package cn.biplam.common.bean;

import java.util.ArrayList;

import cn.biplam.common.bean.sqlengine.Sql;
import cn.biplam.common.client.ClassUtil;
import cn.biplam.common.client.Database;
import cn.biplam.common.client.DbResource;
import cn.biplam.common.client.OperatorResult;
import cn.biplam.common.paramters.SysName;
import cn.biplam.common.wrapper.ErrorMessage;

/**
 * 服务存根基础类<br>
 *  此类提供了取Bean实例的方法和sql操作的方法
 */
public abstract class Bean {

	/** 用户ID */
	protected String userId=SysName.SysUser;
	/** 页面id*/
	protected String pageId;
	/** 数据源 */
	protected DbResource dbResource ;
	/** 操作结果 */
	protected OperatorResult result;

	/**
	 * 设置数据源(如果不设置默认用RT) 
	 * @param dbResource 数据源
	 */
	protected void setDbResouce(DbResource dbResource){
		this.dbResource = dbResource;
	}

	/**
	 * 设置用户id和页面id
	 * @param userId 用户id  默认用系统用户id
	 * @param pageId 页面id  默认为null
	 */
	protected void setUserId(String userId,String pageId){
		this.userId = userId;
		this.pageId = pageId;
	}

	/**
	 * Select查询,返回记录条数<=500<br>
	 *   需设置DbResource、userId、pageId。如果不设置DbResource用 默认数据源RT,userId默认用系统用户,pageId默认为null
	 * @param sql 查询sql
	 * @return OperatorResult 查询结果集
	 * @throws ErrorMessage
	 */
	protected OperatorResult doingSelect(Sql sql) throws ErrorMessage{
		initDbResource();
		this.result=new OperatorResult();
		Database database=new Database(this.dbResource,userId,pageId);
		this.result.setSelectResult(database.executeSelect(sql));
		return this.result;
	}

	/**
	 * Select查询,返回记录条数<=resultSize<br>
	 *   需设置DbResource、userId、pageId。如果不设置DbResource用 默认数据源RT,userId默认用系统用户,pageId默认为null
	 * @param sql 查询sql
	 * @param resultSize 结果集返回条数
	 * @return OperatorResult 查询结果集
	 * @throws ErrorMessage
	 */
	protected OperatorResult doingSelect(Sql sql,int resultSize) throws ErrorMessage{
		this.result=new OperatorResult();
		Database database=new Database(this.dbResource,userId,pageId);
		this.result.setSelectResult(database.executeSelectLimit(sql,resultSize));
		return this.result;
	}

	/**
	 * DML查询<br>
	 *   需设置DbResource、userId、pageId。如果不设置DbResource用 默认数据源RT,userId默认用系统用户,pageId默认为null
	 * @param sql 可执行sql集合
	 * @return OperatorResult sql执行结果
	 * @throws ErrorMessage
	 */
	protected OperatorResult doingDML(ArrayList<String> sql) throws ErrorMessage{
		initDbResource();
		this.result=new OperatorResult();
		Database database=new Database(this.dbResource,userId,pageId);
		if(sql.size()>0){
			this.result.setDmlResult(database.executeDMLBatch(sql));
		}
		return this.result;
	}

	/**
	 *  设置当前Bean的返回结果为SQL
	 * @param sql 当前返回的SQL
	 */
	protected OperatorResult setSql(ArrayList<String> sql){
		if(this.result == null){
			this.result = new OperatorResult();
		}
		this.result.setSqls(sql);
		return this.result;
	}

	protected static Bean get(String className,Object... classParams) throws ErrorMessage{
		if(classParams!=null){
			return (Bean)ClassUtil.get(className, classParams);
		}else{
			return (Bean)ClassUtil.get(className);
		}
	}

	/**
	 * 如果数据源为null则初始化默认数据源
	 * @throws ErrorMessage
	 */
	private void initDbResource() throws ErrorMessage{
		if(this.dbResource==null){
			this.dbResource = new DbResource();
		}
	}

}
